home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 59425 / 59425.xpi / chrome / content / sidebar.js < prev    next >
Encoding:
JavaScript  |  2010-02-09  |  7.2 KB  |  200 lines

  1. // Sidebar has its own NS, so no need to object-encapsulate
  2.  
  3. // Simplified version of jQuery's $.each function
  4. var each = function(list, fun){
  5.     for (var i=0; i < list.length; i++)
  6.         if (fun.apply(list[i]) == false) return list
  7.     return list
  8. }
  9.  
  10. var collapseNode = function(el) {addClass(el, "hidden")}
  11. var expandNode = function(el){removeClass(el, "hidden")}
  12. var addClass = function(el, class){
  13.     var classes = el.className.split(" ")
  14.     if (!(class in classes)) {
  15.         classes.push(class)
  16.         el.className = classes.join(" ")
  17.     }
  18. }
  19. var removeClass = function(el, class){
  20.     el.className = el.className.split(" ").filter(function(el){return el != class}).join(" ")
  21. }
  22.  
  23.  
  24. var init = function (){
  25.     if (!pref("show_prefbutton")) {
  26.         var b = document.getElementsByTagName("button")[0]
  27.         b.parentNode.removeChild(b)
  28.     }
  29.  
  30.     populate()
  31. }
  32.  
  33. var bookmarks = Components.classes["@mozilla.org/browser/nav-bookmarks-service;1"].getService(Components.interfaces.nsINavBookmarksService);
  34. var hist = Components.classes["@mozilla.org/browser/nav-history-service;1"].getService(Components.interfaces.nsINavHistoryService);
  35. var favicons = Components.classes["@mozilla.org/browser/favicon-service;1"].getService(Components.interfaces.nsIFaviconService);
  36. var io = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService)
  37. var win = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
  38.     .getInterface(Components.interfaces.nsIWebNavigation)
  39.     .QueryInterface(Components.interfaces.nsIDocShellTreeItem)
  40.     .rootTreeItem
  41.     .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
  42.     .getInterface(Components.interfaces.nsIDOMWindow);
  43. var pref = favmarks.pref
  44. var log = favmarks.log
  45.  
  46. var populate = function(){
  47.     var tops = []
  48.     if (pref("show_places")) tops.push(bookmarks.placesRoot)
  49.     if (pref("show_bms_menu")) tops.push(bookmarks.bookmarksMenuFolder)
  50.     if (pref("show_tags")) tops.push(bookmarks.tagsFolder)
  51.     if (pref("show_unfiled")) tops.push(bookmarks.unfiledBookmarksFolder)
  52.     if (pref("show_bms_toolbar")) tops.push(bookmarks.toolbarFolder)
  53.  
  54.     var tops_labels = []
  55.     tops_labels[bookmarks.placesRoot] = "Places"
  56.     tops_labels[bookmarks.bookmarksMenuFolder] = bookmarks.getItemTitle(bookmarks.bookmarksMenuFolder)
  57.     tops_labels[bookmarks.tagsFolder] = bookmarks.getItemTitle(bookmarks.tagsFolder)
  58.     tops_labels[bookmarks.unfiledBookmarksFolder] = bookmarks.getItemTitle(bookmarks.unfiledBookmarksFolder)
  59.     tops_labels[bookmarks.toolbarFolder] = bookmarks.getItemTitle(bookmarks.toolbarFolder)
  60.  
  61.     each(tops, function(){
  62.         var root = document.createElement("vbox")
  63.         var label = document.createElement("label")
  64.         label.setAttribute("value", tops_labels[this])
  65.         root.appendChild(label)
  66.  
  67.         var tree = getTree(this)
  68.         root.appendChild(tree)
  69.         document.getElementById("favmarks-container").appendChild(root)
  70.         tree.className = ""
  71.         if (pref("expanded_folders") != "")
  72.             each(pref("expanded_folders").split("|"), function(){
  73.                 document.getElementById("folder-"+this).expand()
  74.             })
  75.     })
  76. }
  77.  
  78. var __exapse = function(id, action){
  79.     var expanded = []
  80.     var nums = pref("expanded_folders").split("|")
  81.     for (var i=0; i<nums.length; i++)
  82.         if (parseInt(nums[i]))
  83.             expanded.push(parseInt(nums[i]))
  84.  
  85.     switch(action){
  86.         case "expand":
  87.             if (expanded.indexOf(id) == -1)
  88.                 expanded.push(id)
  89.             break
  90.         case "collapse":
  91.             if (expanded.indexOf(id) != -1)
  92.                 expanded = expanded.filter(function(el){return el != id})
  93.             break
  94.         case "toggle":
  95.         default:
  96.             if (expanded.indexOf(id) == -1)
  97.                 expanded.push(id)
  98.             else
  99.                 expanded = expanded.filter(function(el){return el != id})
  100.             break
  101.     }
  102.  
  103.     pref("expanded_folders", expanded.sort().join("|"))
  104. }
  105. var toggleExpanded = function(id){__exapse(id, "toggle")}
  106. var expand = function(id){__exapse(id, "expand")}
  107. var collapse = function(id){__exapse(id, "collapse")}
  108.  
  109. var getTree = function(id){
  110.     var marks = getFolder(id)
  111.  
  112.     var tree = document.createElement("vbox")
  113.     tree.id = "folder-"+id
  114.     tree.className = "hidden folder"
  115.  
  116.     var root = document.createElement("box")
  117.     tree.appendChild(root)
  118.  
  119.     for (var i=0; i<marks.length; i++) {
  120.         var item = marks[i]
  121.         switch(item.type) {
  122.             case item.RESULT_TYPE_URI:
  123.                 var rep = document.createElement("image")
  124.                 rep.setAttribute(
  125.                     "src",
  126.                     favicons.getFaviconImageForPage(
  127.                         io.newURI(item.uri, null, null)
  128.                     ).spec
  129.                 )
  130.                 rep.setAttribute("tooltiptext", item.title)
  131.                 rep.appendChild(document.createTextNode(item.uri))
  132.                 rep.addEventListener("click", function(e){
  133.                     switch(e.which){
  134.                         // left
  135.                         case 1:
  136.                             win.gBrowser.loadURI(this.firstChild.textContent)
  137.                             break
  138.                         // middle
  139.                         case 2:
  140.                             win.gBrowser.selectedTab = win.gBrowser.addTab(this.firstChild.textContent)
  141.                             break
  142.                         // right
  143.                         case 3:
  144.                             break
  145.                     }
  146.                 }, false)
  147.                 root.appendChild(rep)
  148.                 break
  149.             case item.RESULT_TYPE_FOLDER:
  150.             case item.RESULT_TYPE_DYNAMIC_CONTAINER:
  151.                 var text = document.createElement("label")
  152.                 text.appendChild(document.createTextNode(item.title))
  153.                 text.addEventListener("click", function(e){
  154.                     switch(e.which) {
  155.                         // left
  156.                         case 1:
  157.                         case 2:
  158.                             var id = parseInt(this.parentNode.id.replace("folder-", ""))
  159.                             if (this.parentNode.className.match("hidden")) {
  160.                                 expand(id)
  161.                                 expandNode(this.parentNode)
  162.                             }
  163.                             else {
  164.                                 collapse(id)
  165.                                 collapseNode(this.parentNode)
  166.                             }
  167.                             break
  168.                         // middle
  169.                         //case 2:
  170.                         //    break
  171.                         // right
  172.                         case 3:
  173.                             break
  174.                     }
  175.                 }, false)
  176.  
  177.                 var box = getTree(item.itemId)
  178.  
  179.                 box.insertBefore(text, box.firstChild)
  180.                 tree.appendChild(box)
  181.                 break
  182.         }
  183.     }
  184.     return tree
  185. }
  186.  
  187. var getFolder = function(id){
  188.     var q = hist.getNewQuery()
  189.     q.setFolders([id], 1)
  190.     var res = hist.executeQuery(q, hist.getNewQueryOptions()).root
  191.     var ret = []
  192.     res.containerOpen = true
  193.     for (var i=0; i<res.childCount; i++)
  194.         ret.push(res.getChild(i))
  195.     return ret
  196. }
  197.  
  198. // run every time the window (sidebar) is loaded
  199. document.addEventListener("DOMContentLoaded", init, false)
  200.